package damo2;

import java.util.Arrays;

public class MyArrayList {
    public int[] elem;
    public int useSize;//当前数组当中存储了多少数据。
    public static final int DEFAULT_SIZE = 5;
    public MyArrayList(){//定义一个数组默认大小为10
        this.elem = new int[DEFAULT_SIZE];
    }
    //重载MyArrayList方法，初始化数组的时候，数组大小由调用者，控制
    public MyArrayList(int d){
        this.elem = new int[d];
    }
    //遍历顺序表
    public void display(){
        for (int i = 0; i < this.useSize; i++) {
            System.out.print(this.elem[i]+" ");
        }
        System.out.println();
    }
    //获取顺序表的长度
    public int size(){
        return this.useSize;
    }
    //判断是否包含某个元素
    public boolean contains(int toFind){
        for(int i = 0;i < this.useSize;i++){
            if(this.elem[i] == toFind){
                return true;
            }
        }
        return false;
    }
    //查找某个元素对应的位置
    public int indexOf(int toFind) {
        for (int i = 0; i < this.useSize; i++) {
            if (this.elem[i] == toFind) {
                return i;//找到这个数据返回下标。
            }
        }
        return -1;//因为数组没有 负数下标。
    }
    /*
    * 判断数组是否满了
    */
    public Boolean isFull(){
        if(this.useSize == this.elem.length){
            return true;
        }
        return false;
        //return this.useSize == this.elem.length
    }
    /*
    * 扩容
    */
    private void resize(){
        this.elem = Arrays.copyOf(this.elem,2*this.elem.length);

    }
    //新增数组元素
    public void add(int data){
        if(this.isFull()){
            resize();
//            this.elem = Arrays.copyOf(this.elem,2*this.elem.length);
        }
        this.elem[this.useSize] = data;
        this.useSize++;
    }
    //在pos位置插入数据
    public void add(int pos,int data){
        checkAddIndex(pos);//检查pos的合法性
        if(isFull()){//检查数组是否满了，满了进行扩容
            resize();
//            this.elem = Arrays.copyOf(this.elem,2*this.elem.length);
        }
        for (int i = useSize-1; i >= pos; i--) {
            elem[i+1] = elem[i];
        }
        elem[pos] = data;
        useSize++;
    }
    /*
    * 检查add数据的时候，pos是否是合法的
    * */
    private void checkAddIndex(int pos){
        if(pos < 0 || pos > useSize){
            throw new IndexOutOfException("add元素的时候，位置不合法,请检查位置的合法性");
        }
    }
//    获取pos位置的元素
    public int get(int pos){
        checkIndex(pos);
        return elem[pos];
    }
    private void checkIndex(int pos){
        if(pos < 0 || pos >= useSize){//想要得到pos下标位置的元素的时候，useSize位置没有元素，所以不用得到该下标的元素。
            throw new IndexOutOfException("位置不合法,请检查位置的合法性");
        }
    }
    //将pos位置的元素修改为value
    public void set(int pos, int value) {
        checkIndex(pos);
        elem[pos] = value;
    }
    //删除第一次出现的关键字key
    public boolean remove(int toRemove){
        int index = indexOf(toRemove);//查找数组中，对应元素的位置。
        if(index == -1){
            System.out.println("没有这个数据");
            return false;
        }
        for (int i = index; i < useSize-1; i++) {
            elem[i] = elem[i+1];
        }
        useSize--;
        elem[useSize]=0;//这里因为useSize--,所以直接将elem[useSize]元素置0。
       // elem[useSize]=null;当数组类型是引用类型时，将其值为null.
        return true;
    }
    public void clear(){
        /*当数组的类型为引用数据类型时，可以用这种写法
        * for(int i = 0 ;i < useSize; i++){
        *       elem[i] = null;
        * }
        * */
        useSize = 0;
    }
}
